PySpark数据框架列参考:df.col vs. df['col'] vs. F.col('col')?

您所在的位置:网站首页 pyspark col PySpark数据框架列参考:df.col vs. df['col'] vs. F.col('col')?

PySpark数据框架列参考:df.col vs. df['col'] vs. F.col('col')?

#PySpark数据框架列参考:df.col vs. df['col'] vs. F.col('col')?| 来源: 网络整理| 查看: 265

问题描述

我有一个概念,希望您可以帮助澄清:

参考Pyspark DataFrame中的列以下三种方法有什么区别.我知道不同的情况需要不同的形式,但不确定为什么.

df.col :例如 F.count(df.col) df ['col'] :例如 df['col'] == 0 f.col('col'):例如 df.filter(F.col('col').isNull())

非常感谢!

推荐答案

在大多数实际应用中,几乎没有区别.但是,它们是通过对不同基础功能的调用来实现的(df = spark.createDataFrame( [(1,'a', 0), (2,'b',None), (None,'c',3)], ['col', '2col', 'third col'] ) df.show() #+----+----+---------+ #| col|2col|third col| #+----+----+---------+ #| 1| a| 0| #| 2| b| null| #|null| c| 3| #+----+----+---------+ 1. df.col

这是最不灵活的.您只能使用.运算符访问的有效列.该排除包含空格或特殊字符和列名称的列名,该名称以整数开头.

此语法调用df.__getattr__("col").

print(df.__getattr__.__doc__) #Returns the :class:`Column` denoted by ``name``. # # >>> df.select(df.age).collect() # [Row(age=2), Row(age=5)] # # .. versionadded:: 1.3

使用.语法,您只能访问此示例数据框的第一列.

>>> df.2col File "", line 1 df.2col ^ SyntaxError: invalid syntax

在引擎盖下,它检查了是否包含df.columns中的列名,然后返回指定的pyspark.sql.Column.

2. df["col"]

这致电df.__getitem__.您有更多的灵活性,因为您可以完成__getattr__可以做的所有事情,而且您可以指定任何列名.

df["2col"] #Column

再次,在引擎盖下检查了一些条件,在这种情况下,返回了输入字符串指定的pyspark.sql.Column.

此外,您可以作为传递多个列(如list或tuple)或列表达式.

from pyspark.sql.functions import expr df[['col', expr('`third col` IS NULL')]].show() #+----+-------------------+ #| col|(third col IS NULL)| #+----+-------------------+ #| 1| false| #| 2| true| #|null| false| #+----+-------------------+

请注意,对于多列,__getitem__只是呼叫 pyspark.sql.DataFrame.select .

最后,您还可以通过索引访问列:

df[2] #Column 3. pyspark.sql.functions.col

这是选择列并返回a expression(所有列函数的情况)的火花本地方法,该方法基于给定名称选择列.当您需要指定要列而不是字符串文字时,这是有用的速记.

例如,假设我们想制作一个新列,该列将根据"col"或"third col"的值来基于"2col"的值:

的值. from pyspark.sql.functions import when df.withColumn( 'new', f.when(df['2col'].isin(['a', 'c']), 'third col').otherwise('col') ).show() #+----+----+---------+---------+ #| col|2col|third col| new| #+----+----+---------+---------+ #| 1| a| 0|third col| #| 2| b| null| col| #|null| c| 3|third col| #+----+----+---------+---------+

糟糕,这不是我的意思. Spark以为我想要字面的字符串"col"和"third col".相反,我应该写的是:

from pyspark.sql.functions import col df.withColumn( 'new', when(df['2col'].isin(['a', 'c']), col('third col')).otherwise(col('col')) ).show() #+----+----+---------+---+ #| col|2col|third col|new| #+----+----+---------+---+ #| 1| a| 0| 0| #| 2| b| null| 2| #|null| c| 3| 3| #+----+----+---------+---+

因为是col()创建列表达式而不检查其中有两个有趣的副作用.

它可以被重新使用,因为它不是DF特定的 可以在分配DF之前使用 age = col('dob') / 365 if_expr = when(age < 18, 'underage').otherwise('adult') df1 = df.read.csv(path).withColumn('age_category', if_expr) df2 = df.read.parquet(path)\ .select('*', age.alias('age'), if_expr.alias('age_category'))

age生成Column if_expr生成Column

本文地址:https://www.itbaoku.cn/post/2032885.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3